/**
 * class-based OOP
 * 1.把类抽象为Class类类型
 * 2.以混入mix的机制实现类方法继承，故无法用 instanceof 来判断是否为父类的实例
 * 3.支持对象生命周期中initialize的定义
 * 4.只允许单继承，多继承的方式可以通过implement实现
 * 
 * @param {Object} json
 * @example
 * var Animal= new Class({
 * 	initialize:function(){console.log("Animal");},
 *  eat:function(){console.log("eat");}	
 * });
 * 
 * var Bird = new Class({
 *  extend: Animal,
 *  name："Bird",
 *  initialize:function(){console.log("Bird");},
 *  public:{
 *  	fly:function(){console.log("fly");}
 *  }
 *  	
 * });
 * 
 * 
 * var bird=new Bird();  
 */

san.def("Class",function(){
	
    
    function Class(json){
    		
        if (this === window) {
            return new Class(json);
        }
		
        var clazz = function(){
			
			this.constructor = clazz; //在对象中自维护constructor，阻断查找对象原型中constructor可能会出现的问题
			
			var parent=clazz.parent,extendChain=[];
			
			while(parent){  //递归寻找父类
				extendChain.push(parent);
				parent=parent.parent;
			}
			
			var len=extendChain.length;
			
			for(var i=len;i > 0;--i){ //从上而下的 初始化 继承链上对象
				extendChain[i-1] = new extendChain[i-1];
			}
			
			for(var i=0;i < len; ++i){ //从下而上的 混入继承链上对象方法
				clazz.addMethods(extendChain[i],false);
			}
			
			
            var value = (this.initialize &&(typeof this.initialize === "function")) ? this.initialize.apply(this, arguments) : this;
			
            return value;

        };
		
     	clazz.prototype=json||{};
		
        clazz.prototype.constructor=clazz;
		
		/*静态方法*/
		
		/**
		 * 给类添加方法
		 * @param {Object} mehtods
		 * @override {Boolean} override 默认是覆盖式的
		 */
        clazz.addMethods = function(json,override){
			
			if(override === undefined) override=true ;  //默认是覆盖式的
			
			for(i in json){
			
				if(typeof  clazz.prototype[i] === "undefined"){
					
					clazz.prototype[i] = json[i];
					
				}else{
					!override||(clazz.prototype[i] = json[i]);				
				}
			}
			
			
            return clazz; // 返回类对象本身
        };
		
		/**
		 * 类继承
		 * @param {Class} parentClass 
		 */
		clazz.extend = function(parentClass){
			
			clazz.parent=parentClass;
					
			return clazz; // 返回类对象本身
		};
		
        return clazz;
    }
		
	
	//TEST CODE
	/*
	var Animal = new Class({
		initialize:function(){console.log("Animal");},
		eat:function(){console.log("eat");}	
	});
	
	var Bird = new Class({
		initialize:function(){console.log("Bird");},
		fly:function(){console.log("fly");}	
	
	});
	
	Bird.extend(Animal);
	
	var bird=new Bird();
	*/
	
});
